package pessoas;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import util.Data;
import util.IllegalArgumentException;
import util.PersistenceMechanismException;
import util.PersistenceMechanismRDBMS;
import util.RepositorioException;

public class RepositorioPessoasBDR implements RepositorioPessoas {
	// , IteratorPessoas {
	
	private PersistenceMechanismRDBMS pm;
	private static RepositorioPessoasBDR instance;

	private RepositorioPessoasBDR() {
        try {
            pm = PersistenceMechanismRDBMS.getInstance();
            pm.connect(this);
        }
        catch (Exception ex) {
            //System.out.println(ex.getMessage()); 
            ex.printStackTrace();
        }
    }

	public void atualizar(Pessoa pessoa) throws RepositorioException,
			IllegalArgumentException, PessoaInexistenteException {
		try {			
			String sql = "UPDATE PESSOAS SET nome = '" + pessoa.getNome() 
					+ "', sobrenome = '" + pessoa.getSobrenome()
					+ "', cpf = '" + pessoa.getCpf()
					+ "', rg = '" + pessoa.getRg() 
					+ "', endereco = '"	+ pessoa.getEndereco()
					+ "', dataCadastro = '"	+ pessoa.getDataCadastro()
					+ "', dataNascimento = '" + pessoa.getDataNascimento()
					+ "', telefoneCelular = '" + pessoa.getTelefoneCelular()
					+ "', telefoneResidencial = '" + pessoa.getTelefoneResidencial()
					+ "' WHERE codigo = '" + pessoa.getCodigo() + "'";
			
			Statement statement = (Statement) pm.getCommunicationChannel(this);
			int i = statement.executeUpdate(sql);
			if (i == 0) {
				throw new PessoaInexistenteException(pessoa.getCodigo());
			}
		} catch(PersistenceMechanismException e){
            throw new RepositorioException(e);
        } catch (SQLException e) {
			throw new RepositorioException(e);
		} 
	}

	public synchronized static RepositorioPessoasBDR getInstance() {
		if (instance == null) {
			instance = new RepositorioPessoasBDR();
		}
		return instance;
	}

	public boolean existe(long codigo) throws RepositorioException {
		boolean resposta = false;
		try {
			Statement statement = (Statement) pm.getCommunicationChannel(this);
			ResultSet resultset = statement.executeQuery("SELECT * FROM PESSOAS WHERE codigo = '" + codigo + "'");
			resposta = resultset.next();
			resultset.close();
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PersistenceMechanismException e) {
			// TODO Auto-generated catch block
			throw new RepositorioException(e);
		} 
		return resposta;
	}

	public void inserir(Pessoa pessoa) throws RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel(this);
			statement.executeQuery("INSERT INTO PESSOAS (codigo,nome,sobrenome,cpf,rg,endereco,dataCadastro," +
								  "dataNascimento, telefoneCelular,telefoneResidencial) VALUES ('"
							+ pessoa.getCodigo()+ "', '"
							+ pessoa.getNome()+ "', '"
							+ pessoa.getSobrenome()+ "', '"
							+ pessoa.getCpf()+ "', '"
							+ pessoa.getRg()+ "', '"
							+ pessoa.getEndereco()+ "', '"
							+ pessoa.getDataCadastro()+ "', '"
							+ pessoa.getDataNascimento()+ "', '"
							+ pessoa.getTelefoneCelular()+ "', '"
							+ pessoa.getTelefoneResidencial() + "')");

		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} 
	}

	public void complementarPessoa(Pessoa pessoa)
			throws PessoaInexistenteException, RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel(this);
			ResultSet resultset = statement.executeQuery("SELECT * FROM PESSOAS WHERE codigo = '" + pessoa.getCodigo() + "'");
			if (resultset.next()) {
				pessoa.setNome(resultset.getString("nome"));
				pessoa.setSobrenome(resultset.getString("sobrenome"));
				pessoa.setCpf(resultset.getString("cpf"));
				pessoa.setRg(resultset.getString("rg"));
				pessoa.setEndereco(resultset.getString("endereco"));
				pessoa.setNome(resultset.getString("nome"));
				pessoa.setDataCadastro(new Data(resultset.getString("dataCadastro")));
				pessoa.setDataNascimento(new Data(resultset.getString("dataNascimento")));
				pessoa.setTelefoneCelular(resultset.getString("telefoneCelular"));
				pessoa.setTelefoneResidencial(resultset.getString("telefoneResidencial"));
			} else {
				throw new PessoaInexistenteException(pessoa.getCodigo());
			}
			resultset.close();
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} 
	}

//	public RepositorioPessoas procurar(Statement statement, Pessoa pessoa)
//			throws RepositorioException {
//		IteratorPessoas pessoas = this.getIterator();
//		RepositorioPessoas resposta = new RepositorioPessoasArray();
//		while (pessoas.hasNext()) {
//			Pessoa p = pessoas.next();
//			if (p.match(pessoa)) {
//				resposta.inserir(statement, p);
//			}
//		}
//		return resposta;
//	}

	public void remover(long codigo) throws PessoaInexistenteException,
			RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel(this);
			int pas = statement.executeUpdate("DELETE FROM PESSOAS WHERE codigo='"	+ codigo + "'");
			if (pas == 0) {
				throw new PessoaInexistenteException(codigo);
			}

		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} 
	}

//	public boolean hasNext() {
//		// TODO Auto-generated method stub
//		if (this.iterator >= this.indice) {
//			return false;
//		} else {
//			return true;
//		}
//	
//	}
//
//	public Pessoa next() {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	private IteratorPessoas getIterator() throws RepositorioException {
//		return this.getIterator();
//	}
}
